import mpx from '@mpxjs/core'
import apiProxy from '@mpxjs/api-proxy'
import globalDataStore from '~/store/globalData'

mpx.use(apiProxy, {
  usePromise: true
})
/**
 * 获取微信平台的设备信息
 */
const getWxSystemInfo = function () {
  try {
    return mpx.getSystemInfoSync()
  } catch (e) {}
}

/**
 * 展示loading
 */
const showLoading = (title = '加载中') => {
  if (mpx.showLoading) {
    mpx.showLoading({
      title,
      mask: true
    })
  }
}
/**
 * 关闭loading
 */
const hideLoading = () => {
  if (mpx.hideLoading) {
    mpx.hideLoading()
  }
}
/**
 * 展示toast
 */
const showToast = (content, icon = 'none', duration = 1500) => {
  mpx.showToast({
    title: content,
    icon,
    duration
  })
}
/**
 * modal提示
 * content 提示内容
 */
const showModal = (content, opts = {}) => {
  return new Promise((resolve, reject) => {
    opts = Object.assign(opts, {
      title: opts.title || '提示',
      content,
      success(res) {
        resolve(res)
        if (res.confirm) {
          // - 用户点击确定
        } else if (res.cancel) {
          // - 用户点击取消
        }
      },
      fail(err) {
        reject(err)
      }
    })
    mpx.showModal(opts)
  })
}
/**
 * 将方法promise化
 * @param {Function} func
 */
const promisic = (func) => {
  return function (params = {}) {
    return new Promise((resolve, reject) => {
      const args = Object.assign(params, {
        success: (res) => {
          resolve(res)
        },
        fail: (error) => {
          reject(error)
        }
      })
      func(args)
    })
  }
}

/**
 * 获取 url 中 `query` 部分指定字段的值
 * @param {String} query - query(比如id=1&jobType=12)
 * @param {String} field - 字段名字
 */
const getQueryFieldVal = (query, field) => {
  const reg = new RegExp(`(^|&)${field}=([^&]*)(&|$)`, 'i').exec(query)
  return reg ? reg[2] : ''
}

/**
 * JSON格式转URL参数格式
 * @param {String} baseUrl - 基于此URL拼接(可选)
 * @param {Object} obj     - 需要转的JSON对象
 */
const obj2uri = (baseUrl, obj, isFilter = false) => {
  if (isObject(baseUrl)) {
    obj = baseUrl
    baseUrl = ''
  } else {
    baseUrl += '?'
  }

  for (const k in obj) {
    if (obj[k] || isFilter) baseUrl += `${k}=${(obj[k])}&`
  }
  return baseUrl.substr(0, baseUrl.length - 1)
}
const uri2obj = (query) => {
  const reg = /([^=&\s]+)[=\s]*([^&\s]*)/g
  const obj = {}
  while (reg.exec(query)) {
    obj[RegExp.$1] = RegExp.$2
  }
  return obj
}
/**
 * 获取当前页面的实例
 */
const getCurrentPage = () => {
  const pages = getCurrentPages()
  return pages[pages.length - 1]
}

/**
 * 获取上一个页面的实例
 */
const getPrevPage = () => {
  const pages = getCurrentPages()
  return pages[pages.length - 2]
}
/**
 * 函数节流
 * @param {*} fn
 * @param {*} interval
 */
const throttle = (fn, interval) => {
  let enterTime = 0 // 触发的时间
  const gapTime = interval || 600 // 间隔时间，如果interval不传，则默认600ms
  return function () {
    const context = this
    const backTime = new Date() // 第一次函数return即触发的时间
    if (backTime - enterTime > gapTime) {
      fn.call(context, arguments)
      enterTime = backTime // 赋值给第一次触发的时间，这样就保存了第二次触发的时间
    }
  }
}

/* 函数防抖 */
const debounce = (fn, interval) => {
  let timer
  const gapTime = interval || 1000 // 间隔时间，如果interval不传，则默认1000ms
  return function () {
    clearTimeout(timer)
    const context = this
    const args = arguments // 保存此处的arguments，因为setTimeout是全局的，arguments不是防抖函数需要的。
    timer = setTimeout(function () {
      fn.call(context, args)
    }, gapTime)
  }
}
/**
 * 异步错误处理函数
 */
const awaitWrap = (promise) => {
  return promise
    .then(data => [null, data])
    .catch(err => [err, null])
}

export default {
  getWxSystemInfo,
  showLoading,
  hideLoading,
  showToast,
  showModal,
  promisic,
  getQueryFieldVal,
  decodeURI,
  obj2uri,
  uri2obj,
  getCurrentPage,
  getPrevPage,
  throttle,
  debounce,
  awaitWrap
}
